/**
 * 缓动函数工具类
 * 
 * 提供常用的缓动函数，用于创建更自然的动画效果
 * 缓动函数接收0-1的进度值，返回0-1的缓动后的进度值
 * 
 * 使用示例：
 * ```typescript
 * const progress = 0.5; // 动画进行到50%
 * const easedProgress = EasingFunctions.easeInOutQuad(progress);
 * // 使用缓动后的进度值来设置动画属性
 * ```
 */
export class EasingFunctions {
    /**
     * 二次缓入缓出函数
     * 
     * @param t 动画进度 (0-1)
     * @returns number 缓动后的进度值 (0-1)
     * 
     * 特点：
     * - 开始时缓慢加速
     * - 结束时缓慢减速
     * - 中间部分线性变化
     * - 适合大多数自然动画效果
     * 
     * 数学公式：
     * - 前半段：2 * t * t
     * - 后半段：-1 + (4 - 2 * t) * t
     */
    static easeInOutQuad(t: number): number {
        return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
    }

    /**
     * 弹性缓出函数
     * 
     * @param t 动画进度 (0-1)
     * @returns number 缓动后的进度值 (0-1)
     * 
     * 特点：
     * - 开始时快速变化
     * - 结束时产生弹性反弹效果
     * - 适合弹跳、撞击等动画
     * - 模拟物理弹性效果
     * 
     * 数学公式：
     * 根据不同的进度区间使用不同的二次函数
     * 通过分段函数实现弹性效果
     */
    static easeOutBounce(t: number): number {
        if (t < 1 / 2.75) {
            // 第一段：快速上升
            return 7.5625 * t * t;
        } else if (t < 2 / 2.75) {
            // 第二段：第一次反弹
            return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;
        } else if (t < 2.5 / 2.75) {
            // 第三段：第二次反弹
            return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;
        } else {
            // 第四段：第三次反弹
            return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;
        }
    }
} 